package com.coder.ipc.binder

import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.IBinder
import android.view.View
import android.widget.Toast
import com.coder.ipc.R

class BindingActivity : AppCompatActivity() {
    private lateinit var mService: LocalService
    private var mBound: Boolean = false

    /** 定义服务绑定的回调，传递给bindService() */
    private val connection = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            // 我们已经绑定到LocalService，强制转换IBinder并获取LocalService实例
            // 因为是强制转换，所有客户端和服务端只能是在一个进程内
            val binder = service as LocalService.LocalBinder
            mService = binder.getService()
            mBound = true
        }

        override fun onServiceDisconnected(name: ComponentName?) {
            mBound = false
        }

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_binding)
    }

    override fun onStart() {
        super.onStart()
        // 绑定到LocalService
        Intent(this, LocalService::class.java).also { intent ->
            bindService(intent, connection, Context.BIND_AUTO_CREATE)
        }
    }

    override fun onStop() {
        super.onStop()
        unbindService(connection)
        mBound = false
    }

    /** 单击按钮时调用（布局文件中的按钮通过android:onClick属性附加到此方法） */
    fun onButtonClick(view: View) {
        if (mBound) {
            // 从LocalService调用方法。
            // 但是，此调用可能挂起，则此请求应在单独的线程中发生，以避免减慢活动性能。
            val num: Int = mService.randomNumber
            Toast.makeText(this, "number: $num", Toast.LENGTH_SHORT).show()
        }
    }


}